package LimitedTimeGame.Day_0203;

/**
 * @author zxc
 * @date 2023/02/03 14:27
 **/

import java.util.Stack;

/**
 * 题目 ：二叉树着色游戏
 * 题目详述 ：
 * 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中，给出二叉树的根节点root，树上总共有 n 个节点，且 n 为奇数，其中每个节点上的值从1 到n各不相同。
 * 最开始时：
 * 「一号」玩家从 [1, n]中取一个值x（1 <= x <= n）；
 * 「二号」玩家也从[1, n]中取一个值y（1 <= y <= n）且y != x。
 * 「一号」玩家给值为x的节点染上红色，而「二号」玩家给值为y的节点染上蓝色。
 * 之后两位玩家轮流进行操作，「一号」玩家先手。
 * 每一回合，玩家选择一个被他染过色的节点，将所选节点一个 未着色 的邻节点（即左右子节点、或父节点）进行染色（「一号」玩家染红色，「二号」玩家染蓝色）。
 * 如果（且仅在此种情况下）当前玩家无法找到这样的节点来染色时，其回合就会被跳过。
 * 若两个玩家都没有可以染色的节点时，游戏结束。着色节点最多的那位玩家获得胜利。
 * 现在，假设你是「二号」玩家，根据所给出的输入，假如存在一个y值可以确保你赢得这场游戏，则返回true ；若无法获胜，就请返回 false 。
 *
 * 提示：
 * 树中节点数目为 n
 * 1 <= x <= n <= 100
 * n 是奇数
 * 1 <= Node.val <= n
 * 树中所有值 互不相同
 */
public class BtreeGameWinningMove {
    /**
     * 思路 ：
     *
     * @param root
     * @param n
     * @param x
     * @return
     */
    public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
        TreeNode node = root;
        // 遍历整棵二叉树，获取node.val == x的二叉树节点;
        Stack<TreeNode> stack = new Stack<>();
        while(node != null || !stack.isEmpty()){
            while(node != null){
                if(node.val == x){
                    break;
                }
                stack.push(node);
                node = node.left;
            }
            if(node != null && node.val == x){
                break;
            }
            node = stack.pop();
            node = node.right;
        }
        // 若是满足题目条件的话，即寻找到：
        //（1）该node节点左子树中所有节点 > n / 2;
        //（2）该node节点右子树中所有节点 > n / 2;
        //（3）该node节点下所有节点 < n / 2 + 1;
        int totalSum = countTotal(node);
        int leftSum = countTotal(node.left);
        int rightSum = countTotal(node.right);
        System.out.println(totalSum + " " + leftSum + " " + rightSum);
        if( totalSum < n / 2 + 1 || leftSum > n / 2 || rightSum > n / 2){
            return true;
        }
        return false;
    }
    // 统计当前二叉树节点node下的节点数;
    private int countTotal(TreeNode node) {
        int total = 0;
        Stack<TreeNode> stack = new Stack<>();
        while(node != null || !stack.isEmpty()){
            while(node != null){
                total++;
                stack.push(node);
                node = node.left;
            }
            node = stack.pop();
            node = node.right;
        }
        return total;
    }


    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
        }
    }
}
